#ifndef SSP_H_
#define SSP_H_
/*******************************************************************************
 * File name:     ssp_gpdma.h
 * Description:
 * Project:       ssp_gpdma
 * Target:        LPC2478
 * Compiler:      arm-none-eabi-gcc
 * Date:          May 18, 2012
 * Author:        kuba
 * Based on:      ---
 ******************************************************************************/

/*==============================================================================
 Includes
==============================================================================*/
# include "irq.h"
/*==============================================================================
 Defines
==============================================================================*/
/* GPDMA buffers size in bytes */
# define SSP0_GPDMA_TX_BUFF_SIZE    1024
# define SSP0_GPDMA_RX_BUFF_SIZE    1024
# define SSP1_GPDMA_TX_BUFF_SIZE    1024
# define SSP1_GPDMA_RX_BUFF_SIZE    1024

/*==============================================================================
 Types
==============================================================================*/
enum sspFreq {
   sspCORE_FREQ,                          /* SSP frequency = core frequency */
   sspCORE_FREQ_DIV2,                     /* SSP frequency = core frequency/2 */
   sspCORE_FREQ_DIV4,                     /* SSP frequency = core frequency/4 */
   sspCORE_FREQ_DIV8                      /* SSP frequency = core frequency/8 */
};

enum sspMode {
   sspMASTER,
   sspSLAVE
};

enum sspFrmSize {                         /* SSP frame size */
   sspFRAME_8BITS,
   sspFRAME_16BITS,
};

enum sspDma {
   sspDMA_DISABLE,
   sspDMA_ENABLE
};

struct sspConf {
   enum priority     priority;            /* IRQ priority */
   enum sspFreq      frequency;           /* SSP frequency */
   enum sspMode      mode;                /* master or slave */
   enum sspFrmSize   frmSize;             /* frame size (16 or 8 bits) */
   enum sspDma       dma;                 /* GPDMA support */
   void (*txService)(void);               /* set service function for TX interrupt */
   void (*rxService)(void);               /* set service function for RX interrupt */
   void (*errorService)(void);            /* set service function in case of error */
};
/*==============================================================================
 Global function prototypes
==============================================================================*/
bool ssp0Init        (const struct sspConf *sspConf);
bool ssp1Init        (const struct sspConf *sspConf);

void ssp0DmaInit     (void);
void ssp1DmaInit     (void);

bool ssp0DmaEnable   (const uint16 *tx, uint16 *rx, const uint32 size);
bool ssp1DmaEnable   (const uint16 *tx, uint16 *rx, const uint32 size);

void ssp0DmaDisable  (void);
void ssp1DmaDisable  (void);

void ssp0ClearFifo   (void);
void ssp1ClearFifo   (void);

/******************************************************************************
* END OF FILE
******************************************************************************/


#endif /* SSP_GPDMA_H_ */
